1、?: 非获取匹配

(?:x)匹配x但是不会捕获,不会 $n 获取到(()有区别),但是可以被替换

  • (?:x) 只匹配,不获取
  • () 可以匹配,也可以被获取
'JavaScript is fun'.replace(/([Jj]ava)(?:[Ss]cript)/,"$2");  // "$2 is fun" 获取不到第二个括号内匹配的值
'JavaScript is fun'.replace(/([Jj]ava)([Ss]cript)/,"$2");  // 'Script is fun'

2、?=?!

  • x(?=y) 只有当 x 后面紧跟着 y 时,才匹配 x
  • x(?!y) 只有当 x 后面不紧跟着 y 时,才匹配 x
相似点:两者都不是匹配结果的一部分,既不会被替换掉(?:区别),也不可以被$n获取到(?:一样
// ?= 和 ?! 区别
'a.jpg,a.png,a.gif,a.jpg'.replace(/a(?!\.jpg)/g, '*'); // "a.jpg,*.png,*.gif,a.jpg"
'a.jpg,a.png,a.gif,a.jpg'.replace(/a(?=\.jpg)/g, '*');  // "*.jpg,a.png,a.gif,*.jpg"

// ?: 和 ?= 区别
"JavaScript is fun".replace(/([Jj]ava)(?:[Ss]cript)/,"$1");  // "Java is fun"  
"JavaScript is fun".replace(/([Jj]ava)(?=[Ss]cript)/,"$1");  // "JavaScript is fun"

listenWind
271 声望3 粉丝